/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package coop.demanda.habitacional;

import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Root;

@Stateless
public class EstadisticasServiceFacade extends AbstractFacade<EstadisticasController> {

    @PersistenceContext(unitName = "coop_demanda-habitacional_war_1.0-SNAPSHOTPU")
    private EntityManager em;

    public EstadisticasServiceFacade() {
        super(EstadisticasController.class);
    }

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public EstadisticasServiceFacade(Class<EstadisticasController> entityClass) {
        super(entityClass);
    }

    public List<DemandaHabitacional> findAllDemandasByMunicipioId(Municipio municipio) {
        return obtenerDemanadas(municipio, false,"","");
    }
            
    public List<DemandaHabitacional> findAllDemandasSegunNecesidad(Municipio municipio, String necesidad) {
        return obtenerDemanadas(municipio, true, "necesidadHabitacional", necesidad);
    }
        
    public List<DemandaHabitacional> findAllDemandasSegunVinculo(Municipio municipio, String vinculo) {
        return obtenerDemanadas(municipio, true, "vinculo", vinculo);
    }
    
    public List<DemandaHabitacional> obtenerDemanadas (Municipio municipio, boolean aplicaFiltro, String labelFiltro, String valueFiltro){
        CriteriaBuilder cBuilder =  getEntityManager().getCriteriaBuilder();
        
        CriteriaQuery cQuery = getEntityManager().getCriteriaBuilder().createQuery();
        
        Root<DemandaHabitacional> c = cQuery.from(DemandaHabitacional.class);
        cQuery.select(c);
        cQuery.where(cBuilder.equal(c.get("municipio"), municipio));        
        if (aplicaFiltro){
            cQuery.where(cBuilder.and(
                            cBuilder.equal(c.get(labelFiltro), valueFiltro),
                            cBuilder.equal(c.get("tieneVivienda"), true),
                            cBuilder.equal(c.get("municipio"), municipio)
                                     )
                        );
            }
        

        //return getEntityManager().createQuery(cQuery).getResultList();
        return getEntityManager().createQuery(cQuery).getResultList();
    }
    
    
    public List<Persona> findAllPersonasByMunicipioId(Municipio municipio) {     
        List<DemandaHabitacional> dhs = findAllDemandasByMunicipioId(municipio);   
        return obtenerPersonas(dhs);      
    }   
    
    public List<Persona> findAllPersonasSegunNecesidad(Municipio municipio, String necesidad) {
        List<DemandaHabitacional> dhs = findAllDemandasSegunNecesidad(municipio, necesidad);
        return obtenerPersonas(dhs);
    }
    
    public List<Persona> findAllPersonasSegunVinculo(Municipio municipio, String vinculo) {
        List<DemandaHabitacional> dhs = findAllDemandasSegunVinculo(municipio, vinculo);
        return obtenerPersonas(dhs);
    }
    
    private List<Persona> obtenerPersonas(List<DemandaHabitacional> dhs) {
        List<Persona> personas = new ArrayList<>();            
        for (DemandaHabitacional dh : dhs) {    
            personas.addAll((List)dh.getGrupoFamiliar());
        } 
        return personas;
    }
    
    
    public List<Persona> findAllPersonasConVivienda(Municipio municipio) {
        CriteriaBuilder cBuilder =  getEntityManager().getCriteriaBuilder();
        CriteriaQuery cQuery = getEntityManager().getCriteriaBuilder().createQuery();
        Root<DemandaHabitacional> c = cQuery.from(DemandaHabitacional.class);
        cQuery.select(c);
        cQuery.where(cBuilder.equal(c.get("municipio"), municipio));     
        cQuery.where(cBuilder.equal(c.get("tieneVivienda"), true));
   
        return obtenerPersonas(getEntityManager().createQuery(cQuery).getResultList());
    }

    public List<DemandaHabitacional> findAllDemandasSegunTieneVivienda(Municipio municipio, boolean tienenVivienda) {
        CriteriaBuilder cBuilder =  getEntityManager().getCriteriaBuilder();
        
        CriteriaQuery cQuery = getEntityManager().getCriteriaBuilder().createQuery();
        
        Root<DemandaHabitacional> c = cQuery.from(DemandaHabitacional.class);
        cQuery.select(c);
        cQuery.where(cBuilder.equal(c.get("municipio"), municipio));        
        cQuery.where(cBuilder.and(
                            
                            cBuilder.equal(c.get("tieneVivienda"), tienenVivienda), 
                            cBuilder.equal(c.get("municipio"), municipio)
                                     )
                        );
            
        return getEntityManager().createQuery(cQuery).getResultList();
    }

    public List<Persona> findAllPersonasSegunTieneVivienda(Municipio municipio, boolean tienenVivienda) {
        List<DemandaHabitacional> dhs = findAllDemandasSegunTieneVivienda(municipio, tienenVivienda);
        return obtenerPersonas(dhs);
    }
    
    
}

